package com.chapter14.demo3;

import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * collect也是一种归约操作、收集器操作，例如将流收集到（转换为）集合或聚合值。
 */
public class CollectStream {
    public static void main(String[] args) {
        Emp[] emps = EmpFactory.getEmp();
        //数组创建流、将流中元素收集到List中
        List<Emp> empList = Arrays.stream(emps).collect(Collectors.toList());
        System.out.println("List:" + empList);

        //数组创建流、将流中元素收集到Set中
        Set<Emp> empSet = Arrays.stream(emps).collect(Collectors.toSet());
        System.out.println("Set:" + empList);


        //数组创建流、将流中元素收集到 创建的ArrayList集合 中
        Collection<Emp> empCollectiont = Arrays.stream(emps).collect(Collectors.toCollection(ArrayList::new));
        System.out.println("Collection:" + empList);

        //数组创建流、将流中元素收集到Map中,以员工姓名作为key,员工对象作为值
        //静态方法Function.identity()表示当前对象
        Map<String, Emp> empMap = Arrays.stream(emps).collect(Collectors.toMap(Emp::getName, Function.identity()));
        System.out.println("Map:" + empMap);

        //计算所有员工薪水的平均值
        Double avgSalary = Arrays.stream(emps).collect(Collectors.averagingDouble(Emp::getSalary));
        System.out.println("avgSalary:" + avgSalary);

        //计算所有员工薪水的总值
        Double sumSalary = Arrays.stream(emps).collect(Collectors.summingDouble(Emp::getSalary));
        System.out.println("sumSalary:" + sumSalary);

        //获取薪水的最小值，minBy按照比较器的比较结果筛选最小值
        Optional<Integer> minSalary = Arrays.stream(emps).map(Emp::getSalary).collect(Collectors.minBy(Comparator.comparing(Function.identity())));
        System.out.println("minSalary:" + minSalary);

        //获取有奖金的所有员工
        List<Emp> list = Arrays.stream(emps).filter(emp -> emp.getBonus() != null).collect(Collectors.toList());
        for (Emp e:list){
            System.out.print(e.getName());
        }
        System.out.println();

        //根据员工所在部门对员工进行分组，groupingBy进行分组操作
        //key：部门  value:员工列表
        Map<String, List<Emp>> groupEmps = Arrays.stream(emps).collect(Collectors.groupingBy(Emp::getDept));
        Set<String> depset = groupEmps.keySet();
        for (String dep:depset){
            System.out.printf("部门[%s]所有的员工有：",dep);
            List<Emp> empsofdep = groupEmps.get(dep);
            for (Emp e:empsofdep){
                System.out.println(e.getName()+" ");
            }
        }

    }
}
